package xml;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import bean.vo.CondicionPagoVO;
import bean.vo.CotizacionVO;
import bean.vo.ItemCotizacionVO;

public class SerializadorCotizacion {

	public static Node serializar(Node nodoPadre, CotizacionVO cotizacion) throws Exception{
		Node nodoCotizacion = null;
		
		if (nodoPadre == null) {
			nodoCotizacion = XmlUtil.createRootNode(Constantes.COTIZACION);
		} else {
			nodoCotizacion = XmlUtil.addChild(nodoPadre, Constantes.COTIZACION, null);
		}
		
		XmlUtil.addComment(nodoCotizacion, Constantes.COMENTARIO_COTIZACION);
		XmlUtil.addAttribute(nodoCotizacion, Constantes.NUMERO, cotizacion.getNumeroCotizacion());
		Node nodoVigencia = XmlUtil.addChild(nodoCotizacion,Constantes.VIGENCIA, null);
		XmlUtil.addChild(nodoVigencia, Constantes.FECHA, cotizacion.getFechaEmision().toString());
		XmlUtil.addChild(nodoVigencia, Constantes.TERMINO, (cotizacion.getFechaCaducidad().getTime() - cotizacion.getFechaEmision().getTime()) / 86400000);
		SerializadorCliente.serializar(nodoCotizacion, cotizacion.getCliente());
		
		Node nodoCondiciones = XmlUtil.addChild(nodoCotizacion,Constantes.COND_VENTA, null);

		if (cotizacion.getPorcentajeDescuentoEfectivo() != null) {
			Node nodoPagoContado = XmlUtil.addChild(nodoCondiciones,Constantes.PAGO_CONTADO, null);
			XmlUtil.addChild(nodoPagoContado, Constantes.DESCUENTO, cotizacion.getPorcentajeDescuentoEfectivo());
		}
		
		for (CondicionPagoVO condPago : cotizacion.getCondicionesPago()) {
			if (condPago.getCantidadDias() > 0) {
				SerializadorCondicionPago.serializar(nodoCondiciones, condPago);
			}
		}
		
		Node nodoReferencia = XmlUtil.addChild(nodoCotizacion,Constantes.REFERENCIA, null);
		
		Node nodoSolicidutd = XmlUtil.addChild(nodoReferencia, Constantes.SOL_COTIZACION, null);
		XmlUtil.addChild(nodoSolicidutd, Constantes.FECHA, cotizacion.getFechaSolicitud());
		XmlUtil.addChild(nodoSolicidutd, Constantes.NUMERO, cotizacion.getNumeroSolicitud());
		
		Node nodoRodamientos = XmlUtil.addChild(nodoReferencia,Constantes.RODAMIENTOS, null);
		for (ItemCotizacionVO itemCot : cotizacion.getItemsCotizacion()) {
			SerializadorItemCotizacion.serializar(nodoRodamientos, itemCot);
		}
		
		return nodoCotizacion;
	}
	
	public static CotizacionVO deserializar(Node nodoCotizacion) throws Exception {
		if (nodoCotizacion.getNodeName() != Constantes.COTIZACION) {
			throw new Exception("Error - nodo cotizacion invalido");
		}
		
		CotizacionVO cotizacion = new CotizacionVO();
		
		cotizacion.setNumeroCotizacion(Integer.parseInt(XmlUtil.getChildNodeValueWithName(nodoCotizacion, Constantes.NNUMERO)));
		
		String fecha = XmlUtil.getChildNodeValueWithName(nodoCotizacion, Constantes.FECHA);
		cotizacion.setFechaEmision(XmlUtil.dateFormat.parse(fecha));
		
		//TODO: levantar condiciones de venta?? mmmm.. no la usamos en ningun lado...
		
		NodeList items = XmlUtil.getChildNodeWithName(nodoCotizacion, Constantes.RODAMIENTOS).getChildNodes();
		for (int i = 0; i < items.getLength(); i++) {
			Node nodoItem = items.item(i);
			if (nodoItem.getNodeName() == Constantes.ITEM) {
				ItemCotizacionVO itemVo = SerializadorItemCotizacion.deserializar(nodoItem);
				cotizacion.agregarItem(itemVo);
			}
		}
		
		return cotizacion;
	}
}
